﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define MAX 3
//int main()
//{
	//指针数组 int *arr[10] 存放指针的数组 
	//数组指针是存放数组的指针 int (*p)[10]=&arr;常在二维数组中使用
	// 
	//int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//int(*p)[10] = &arr;
	//int i = 0;
	//int sz = sizeof(arr) / sizeof(arr[0]);
	//for (i = 0; i < sz; i++)
	//{
	//	printf("%d ", (*p)[i]);//p=&arr---&p=arr;
	//}
//使用数组指针打印二维数组,⼆维数组传参，形参的部分可以写成数组，也可以写成指针形式
	//void test(int (*p)[5]//第一行的地址, int x, int y)
	//{
	//	for (int i = 0; i < x; i++)
	//	{
	//		for (int j = 0; j < y; j++)
	//		{
	//			printf("%d", (*(p + i))[j]);
	//		}
	//		printf("\n");
	//	}
	//}
	//int main()
	//{
	//	int arr[3][5] = { {1,1,1,1,1},{2,2,2,2,2},{3,3,3,3,3} };
	//	test(arr, 3, 5);
	//	return 0;
	//}
// 函数指针变量=函数指针变量应该是⽤来存放函数地址的，未来通过地址能够调⽤函数的
//int test(int x, int y)//&test与test地址相同
//{
//	return x + y;
//}
//int main()
//{
//	test(3, 4);
//	printf("%p\n", test);//
//	printf("%p\n", &test);//
//	return 0;
//}
//int (*p)(int ,int)=test
//p指向函数的返回类型+函数指针变量名+p指向函数的参数类型和个数的交代
	//int (*) (int x, int y) //p函数指针变量的类型
//int Add(int x, int y)
//{
//	return x + y;
//}
//int main()
//{
//	int (*p)(int, int)=Add;
//	printf("%d", (*Add)(3,4));
//	return 0;
//}
//typedef关键字 函数指针数组  int (*parr[4])(int,int)
void menu()
{
	printf("**************************\n");
	printf("**************************\n");
	printf("******1.Add   2.Sub*******\n");
	printf("******3.Mul   4.Div*******\n");
	printf("******    0.exit   *******\n");
	printf("**************************\n");
}
int Add(int x, int y)
{
	return x + y;
}
int Sub(int x, int y)
{
	return x - y;
}
int Mul(int x, int y)
{
	return x * y;
}
int Div(int x, int y)
{
	return x / y;
}
int main()
{
	int x = 0;
	int y = 0;
	int input = 1;
	do
	{
		menu();
		int (*parr[5])(int, int) = { NULL,Add,Sub,Mul,Div };//
		scanf("%d", &input);
		if (0 < input && input < 5)
		{
			printf("请输入操作数\n");
			scanf("%d %d", &x, &y);
			int ret=(*parr[input])(x,y);
			printf("ret=%d\n", ret);
		}
		else if(input==0)
		{
			printf("退出计算器");
		}
		else
		{
			printf("输入有误\n");
		}
	} 
       while (input);
	return 0;
}
//有一个数字矩阵，矩阵的每行从左到右是递增的，矩阵从上到下是递增的，请编写程序在这样的矩阵中查找某个数字是否存在
//int find(int arr[3][3]; int k; int* px; int* py)
//{
//	int x = 0;//行
//	int y = *py - 1;//列
//	while (x <= *px - 1 && y >= 0)
//	{
//		if (arr[x][y] > k)
//		{
//			y--;
//		}
//		else if (arr[x][y] < k)
//		{
//			x++;
//		}
//		else if(arr[x][y] == k)
//		{
//			return 1;
//		}
//		return 0;
//	}
//
//int main()
//{
//	int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
//	int k = 0;
//	int x = 3;
//	int y = 3;
//	printf("请输入要查找的数");
//	scanf("%d", &k);
//	if (1 == find(arr,k,&x,&y))
//	{
//		printf("k在矩形方阵内\n");
//	}
//	else
//	{
//		printf("没找到");
//	}
//
//	return 0;
//}
//int Findnum(int arr[MAX][MAX], int k, int* px, int* py)
//{
//	int x = 0;		//行
//	int y = *py - 1;	//列
//
//	while (x <= *px - 1 && y >= 0)
//	{
//		if (arr[x][y] < k)		//排除行
//		{
//			x++;
//		}
//		else if (arr[x][y] > k)	//排除列
//		{
//			y--;
//		}
//		else
//		{
//			*px = x;			//带回去 x、y 的坐标
//			*py = y;
//			return 1;
//		}
//	}
//	return 0;					//找不到
//}
//
//int main()
//{
//	int arr[MAX][MAX] = { {1,2,3},{4,5,6},{7,8,9} };
//
//	int k, x = 3, y = 3;
//
//	printf("请输入要查找的数:");
//	scanf("%d", &k);
//
//	if (1 == Findnum(arr, k, &x, &y))
//	{
//		printf("找到了,下标是:%d %d\n", x, y);
//	}
//	else
//	{
//		printf("没找到\n");
//	}
//
//	return 0;
//}
